今天是第十七天我們可以寫一個Lstm預測房價系統,以下是程式碼
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
# 讀取數據
data = pd.read_csv('house_prices.csv')
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
# 只使用價格進行預測
price_data = data['Price'].values
price_data = price_data.reshape(-1, 1)
# 標準化數據
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(price_data)
# 創建訓練數據集
def create_dataset(dataset, time_step=1):
X, Y = [], []
for i in range(len(dataset)-time_step-1):
X.append(dataset[i:(i+time_step), 0])
Y.append(dataset[i + time_step, 0])
return np.array(X), np.array(Y)
time_step = 10 # 使用前10個時間點來預測下一個時間點
X, Y = create_dataset(scaled_data, time_step)
# 重塑數據為 [samples, time steps, features]
X = X.reshape(X.shape[0], X.shape[1], 1)
# 建立 LSTM 模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 訓練模型
model.fit(X, Y, epochs=100, batch_size=32)
# 預測下一個時間點的房價
last_10_days = scaled_data[-time_step:]
last_10_days = last_10_days.reshape(1, time_step, 1)
predicted_price = model.predict(last_10_days)
predicted_price = scaler.inverse_transform(predicted_price)
print(f"預測的下一個時間點的房價: {predicted_price[0][0]}")
# 繪製預測結果
train = data[:len(data)-time_step]
valid = data[len(data)-time_step:]
valid['Predictions'] = predicted_price
plt.figure(figsize=(16,8))
plt.title('LSTM 模型預測房價')
plt.xlabel('日期', fontsize=18)
plt.ylabel('價格', fontsize=18)
plt.plot(train['Price'])
plt.plot(valid[['Price', 'Predictions']])
plt.legend(['訓練數據', '真實價格', '預測價格'], loc='lower right')
plt.show()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
data = pd.read_csv('house_prices.csv')
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
Date
和 Price
。price_data = data['Price'].values
price_data = price_data.reshape(-1, 1)
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(price_data)
def create_dataset(dataset, time_step=1):
X, Y = [], []
for i in range(len(dataset)-time_step-1):
X.append(dataset[i:(i+time_step), 0])
Y.append(dataset[i + time_step, 0])
return np.array(X), np.array(Y)
X
是輸入特徵,Y
是標籤(即預測值)。
X
:包含前 time_step
個時間點的價格數據。Y
:對應於 X
之後的下一個時間點的價格,即我們要預測的目標值。time_step = 10 # 使用前10個時間點來預測下一個時間點
X, Y = create_dataset(scaled_data, time_step)
X = X.reshape(X.shape[0], X.shape[1], 1)
create_dataset
函數生成輸入特徵和標籤。[samples, time steps, features]
,所以我們將 X
轉換為這種格式。model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
return_sequences=False
)。model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X, Y, epochs=100, batch_size=32)
adam
優化器並採用均方誤差(MSE)作為損失函數來編譯模型。epochs
),每次訓練批次大小為 32。last_10_days = scaled_data[-time_step:]
last_10_days = last_10_days.reshape(1, time_step, 1)
predicted_price = model.predict(last_10_days)
predicted_price = scaler.inverse_transform(predicted_price)
print(f"預測的下一個時間點的房價: {predicted_price[0][0]}")
train = data[:len(data)-time_step]
valid = data[len(data)-time_step:]
valid['Predictions'] = predicted_price
plt.figure(figsize=(16,8))
plt.title('LSTM 模型預測房價')
plt.xlabel('日期', fontsize=18)
plt.ylabel('價格', fontsize=18)
plt.plot(train['Price'])
plt.plot(valid[['Price', 'Predictions']])
plt.legend(['訓練數據', '真實價格', '預測價格'], loc='lower right')
plt.show()
這個程式碼展示了一個基於 LSTM 的時間序列預測模型,從數據的預處理到模型的構建、訓練以及最終的預測和可視化。通過這個模型,我可以根據歷史房價數據來預測未來的房價。我可以根據你的實際需求對模型進行調整,例如修改 time_step
的大小,添加更多的 LSTM 層,或調整模型的超參數以獲得更好的預測效果。